package org.je.xml;


import java.util.Map;

import org.je.ufo.Int;
import org.je.util.CharUtil;
import org.je.util.StringUtil;

/***
 * 一些帮助的工具类
 * 
 * @author fyf
 */
class XmlEleUtil
{
	public static Element getElementById(Element node, String id) {
		if (node.type != Element.XML_CLOSED_NODE) {
			return null;
		}
		if (StringUtil.equals(node.id ,id)) {
			return node;
		}
		if (node.children != null) {
			for (Element e : node.children) {
				Element tem = getElementById(e ,id);
				if (tem != null) {
					return tem;
				}
			}
		}
		return null;
	}

	/**
	 * 格式化xml节点
	 * 
	 * @param ele
	 * @param level
	 * @return
	 */
	public static String toXml(Element ele, int level) {
		if (ele.value == null || ele.type == 0) {
			return null;
		}

		StringBuilder bf = new StringBuilder();

		for (int i = 0; i < level; ++i) {
			bf.append(" ");
		}

		if (ele.type == Element.XML_CLOSED_NODE) {
			bf.append("<" + ele.value);

			if (ele.atts != null) {
				for (Map.Entry<String, String> e : ele.atts.entrySet()) {
					if (e.getValue().indexOf("'") != -1) {
						bf.append(" " + e.getKey() + "=\"" + e.getValue() + "\"");
					} else {
						bf.append(" " + e.getKey() + "='" + e.getValue() + "'");
					}
				}
			}

			if (ele.children == null || ele.children.size() == 0) {
				bf.append("/>\r\n");
			} else if (ele.children.size() == 1 && ele.getFirst().type == Element.XML_TEXT) {
				bf.append(">");
				bf.append(toXml(ele.getFirst() ,0));
				bf.append("</" + ele.value + ">\r\n");
			} else // 有子节点
			{
				bf.append(">\r\n");

				for (Element e : ele.children) {
					bf.append(toXml(e ,level + 1));
				}
				if (ele.getLast().type == Element.XML_TEXT) {
					bf.append("\r\n");
				}
				for (int i = 0; i < level; ++i) {
					bf.append(" ");
				}
				bf.append("</" + ele.value + ">\r\n");
			}
		} else // 不是节点类型
		{
			if (ele.type == Element.XML_CDATA) {
				bf.append("<![CDATA[" + ele.value + "]]>\r\n");
			} else if (ele.type == Element.XML_NOTES) {
				bf.append("<!--" + ele.value + "-->\r\n");
			} else if (ele.type == Element.XML_TEXT) {
				bf.append(ele.value.trim());
			}
		}

		return bf.toString();
	}

	/**
	 * 尝试获取xml头部
	 * 
	 * @param xml
	 * @param offset
	 */
	public static void tryFindXmlHead(String xml, Int offset) {
		if (!xml.startsWith("<?xml")) {
			return;
		}

		char c = xml.charAt(5);

		if (!CharUtil.isBlank(c)) {
			throw new RuntimeException("illegal xml head");
		}

		// offset[0] = 5;
		offset.val(5);

		while( true ) {
			String name = XmlAttrUtil.getAttName(xml ,offset ,true);

			if (name.equals("?>")) {
				break;
			} else {
				XmlAttrUtil.findEqSymbol(xml ,offset);
				XmlAttrUtil.getAttValue(xml ,offset ,true);
			}
		}
	}

}
